package com.snsoft.web.controller;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.snsoft.bean.ResultMap;
import com.snsoft.bean.UpdatePasswordForm;
import com.snsoft.bean.UserSession;
import com.snsoft.exception.PasswordErrorException;
import com.snsoft.service.UserService;

import static com.snsoft.util.Constants.*;

/**
 * 
 * @author 慎伟康
 * 
 * @date 2017年11月29日 下午10:02:40
 * 
 * @Description TODO
 *    user模块控制器
 */
@Controller  //声明为一个控制器
@RequestMapping(value="/user")
public class UserController {

	/** 自动装配一个HttpServletRequest，线程级别变量 */
//	@Autowired
//	private HttpServletRequest request;
	
	@Autowired
	private UserService userService;

	/**
	 * 登录接口
	 * 
	 * 添加@ResponseBody注解,告诉Spring跳过正常的模型/视图流程， 并使用消息转换器。
	 * 若要返回Json格式的数据，需要Jackson库的支持。（Jackson相关的消息转换器是自动注册的，不需要配置）
	 * 
	 * @return ResultMap 返回结果集，spring会用消息转换器将对象转为Json。
	 * @throws Exception 将异常交给当前控制器中或处理全局异常的控制器通知中的处理异常的方法处理。
	 */
	@ResponseBody
	@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json")
	public ResultMap login(HttpServletResponse response, HttpSession session,
			@RequestParam(value="userCode", defaultValue="") String userCode,
			@RequestParam(value="userPassWord", defaultValue="") String userPassWord,
			@RequestParam(value="time", defaultValue="0") String time) throws Exception {
		
		//校验参数
		if(StringUtils.isBlank(userCode)){
			return new ResultMap(CODE_ERROR, MSG_CHECK_ACCOUNT, null);
		}
		if(StringUtils.isBlank(userPassWord)){
			return new ResultMap(CODE_ERROR, MSG_CHECK_PASSWORD, null);
		}
		int autoLoginTime = Integer.parseInt(time.trim());
		
		//登录业务处理，因为异常已经抛出，所以不用处理。没有try，catch的代码看着就是舒服！！！
		return userService.loginService(userCode, userPassWord, autoLoginTime, session, response);
	}
	
	/**
	 * 修改密码接口
	 * 
	 * @return ResultMap 返回结果集，spring会用消息转换器将对象转为Json。
	 * @throws Exception 将异常交给当前控制器中或处理全局异常的控制器通知中的处理异常的方法处理。
	 */
	@ResponseBody
	@RequestMapping(value = "/updatePassword", method = RequestMethod.POST)
	public ResultMap updatePassword(@Valid UpdatePasswordForm passwordForm,
			Errors errors, HttpSession session)throws Exception {
		//若校验不合格，则返回错误信息
		if(errors.hasErrors()){
			return new ResultMap(CODE_ERROR, errors.getFieldError().getDefaultMessage(), null);
		}
		//参数逻辑校验
		String oldPassWord = passwordForm.getOldPassWord();
		String newPassWord1 = passwordForm.getNewPassWord1();
		String newPassWord2 = passwordForm.getNewPassWord2();
		if(!newPassWord1.equals(newPassWord2)){
			return new ResultMap(CODE_ERROR, MSG_CHECK_NEWPASSWORDERROR, null);
		}
		if(oldPassWord.equals(newPassWord1)){
			return new ResultMap(CODE_ERROR, MSG_CHECK_NEWEQUALSOLD, null);
		}
		
		//获取当前用户
		UserSession userSession = (UserSession) session.getAttribute("userSession");
		if(userSession == null){
			return new ResultMap(CODE_NOT_LOGIN, MSG_NOT_LOGIN, null);
		}
		
		userService.updatePasswordService(userSession.getUserID(), oldPassWord, newPassWord1);
		return new ResultMap(CODE_SUCCESS, MSG_OPERATE_SUCCESS, null);
	}
	
	/**
	 * 处理PasswordErrorException异常
	 * 当前控制器中所有方法可共用此方法处理PasswordErrorException异常
	 * 
	 * @return
	 */
	@ResponseBody
	@ExceptionHandler(PasswordErrorException.class)
	public ResultMap handlePasswordErrorException(Exception e){
		return new ResultMap(CODE_ERROR, e.getMessage(), null);
	}
	
	/**
	 * 处理UnsupportedEncodingException异常
	 * 当前控制器中所有方法可共用此方法处理UnsupportedEncodingException异常
	 * 
	 * @return
	 */
	@ResponseBody
	@ExceptionHandler(UnsupportedEncodingException.class)
	public ResultMap handleUnsupportedEncodingException(Exception e){
		return new ResultMap(CODE_ERROR, e.getMessage(), null);
	}
	
}
